package 纯编程题配套习题;

import java.util.Arrays;

/**
 * 写一个函数，其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
 * 不要给另外的数组分配额外的空间，你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
 * 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
 * <p>
 * 示例 1：
 * 输入：["h","e","l","l","o"]
 * 输出：["o","l","l","e","h"]
 * <p>
 * 示例 2：
 * 输入：["H","a","n","n","a","h"]
 * 输出：["h","a","n","n","a","H"]
 * <p>
 * https://leetcode-cn.com/problems/reverse-string
 */
public class _344_反转字符串 {
    public static void main(String[] args) {
        char[] char1 = {'h', 'e', 'l', 'l', 'o'};
        reverseString(char1);
        System.out.println(Arrays.toString(char1));

        char[] char2 = {'H', 'a', 'n', 'n', 'a', 'h'};
        reverseString(char2);
        System.out.println(Arrays.toString(char2));
    }

    /**
     * 解题思路:
     * 1、遍历char数组，在遍历得过程中交换前后位置
     * ["h","e","l","l","o"]
     * 0  1  2  3   4
     * h(0)->o(4) 进行交换  chgIndex = 5-1-0
     * e(1)->l(3) 进行交换  chgIndex = 5-1-1
     * chgIndex = length - 1 - startIndex
     */
    public static void reverseString(char[] s) {
        if (s == null) {
            return;
        }
        char tmp;
        for (int i = 0; i < s.length / 2; i++) {
            int chgIndex = s.length - (i + 1);
            tmp = s[i];
            s[i] = s[chgIndex];
            s[chgIndex] = tmp;
        }
    }

    /**
     * 双指针解法 太秀了吧
     */
    public void reverseString2(char[] s) {
        int n = s.length;
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
        }
    }
}
